﻿using AntdUI;
using BST250301TestStand.Models;
using BST250301TestStand.Models.Utils;
using Microsoft.Web.WebView2.Core;
using MySql.Data.MySqlClient;
using Mysqlx.Crud;
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using NPOI.SS.Formula.PTG;
using NPOI.SS.UserModel;
using NPOI.Util;
using NPOI.XSSF.UserModel; // 用于 .xlsx 文件
using ScottPlot;
using ScottPlot.Colormaps;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BST250301.Views
{
    public partial class Web3D : UserControl
    {
        private AntdUI.Window window;
        public Web3D()
        {
            InitializeComponent();

        }
        private async void InitializeWebView2(string htmlPath)
        {
            await webView21.EnsureCoreWebView2Async(null);
            if (webView21.CoreWebView2 != null)
            {      
               
                if (File.Exists(htmlPath))
                {
                    webView21.Source = new Uri($"file:///{htmlPath.Replace("\\", "/")}");
                }
                else
                {
                    MessageBox.Show("3d.htm 文件不存在！");
                    return;
                }

                // 注入 JavaScript 监听器（如果 3d.htm 未包含消息处理）
                string jsCode = $@"
            // 接收消息并绑定值到部件
            window.chrome.webview.addEventListener('message', event => {{
                const receivedValue = event.data.value;
                const targetPartId = event.data.partId;
                updatePartAnnotation(targetPartId, receivedValue);
            }});

            // 函数：更新部件上的标注并跟随移动
            function updatePartAnnotation(partId, value) {{
                // 假设 eDrawings 暴露 markup API 或部件对象；否则使用 DOM 模拟
                let markupElement = document.getElementById('annotation-' + partId); // 预创建的 <div> 或 markup
                if (!markupElement) {{
                    // 创建新标注元素（文本标签）
                    markupElement = document.createElement('div');
                    markupElement.id = 'annotation-' + partId;
                    markupElement.style.position = 'absolute';
                    markupElement.style.color = 'white';
                    markupElement.style.fontSize = '16px';
                    markupElement.style.background = 'rgba(0,0,0,0.7)';
                    markupElement.style.padding = '5px';
                    markupElement.innerText = '值: ' + value;
                    document.body.appendChild(markupElement);
                }} else {{
                    markupElement.innerText = '值: ' + value;
                }}

                // 绑定到部件：获取部件位置（假设 eDrawings 有 getComponentPosition API）
                // 示例：如果 eDrawings 暴露 window.eDrawings.getComponent(partId).position
                if (window.eDrawings && window.eDrawings.getComponent) {{
                    const part = window.eDrawings.getComponent(partId);
                    if (part) {{
                        updateAnnotationPosition(markupElement, part.position); // 更新位置
                        // 监听部件变换事件
                        part.addEventListener('transform', (e) => {{
                            updateAnnotationPosition(markupElement, e.newPosition);
                        }});
                    }}
                }} else {{
                    // 备选：使用 raycasting 或鼠标事件模拟跟随（更复杂）
                    console.log('eDrawings API 未暴露，使用模拟跟随');
                }}
            }}

            // 更新标注位置的辅助函数（转换为屏幕坐标）
            function updateAnnotationPosition(element, worldPosition) {{
                // 将 3D 世界坐标转换为 2D 屏幕坐标（使用相机投影）
                const screenPos = projectToScreen(worldPosition); // 自定义投影函数
                element.style.left = screenPos.x + 'px';
                element.style.top = screenPos.y + 'px';
            }}

            // 示例投影函数（简化版，需要根据 eDrawings 相机调整）
            function projectToScreen(worldPos) {{
                // 这里需集成 Three.js-like 投影或 eDrawings 内部 API
                return {{ x: worldPos.x * 100, y: worldPos.y * 100 }}; // 占位
            }}
        ";
                await webView21.CoreWebView2.ExecuteScriptAsync(jsCode);
            }

            //// 确保 CoreWebView2 属性在 Navigate 之前被初始化
            //await webView21.EnsureCoreWebView2Async(null);
            //// 设置开发人员工具（可选，调试用）
            //webView21.CoreWebView2.Settings.AreDevToolsEnabled = true;
        }
        // 可选：处理从 JS 返回的消息
        private void WebMessageReceivedHandler(object sender, CoreWebView2WebMessageReceivedEventArgs e)
        {
            string message = e.TryGetWebMessageAsString();
            // 在这里处理 JS 反馈，例如更新 Form UI
           MessageBox.Show($"状态: 从 JS 收到: {message}");
        }

        private void buttonAddPro_Click(object sender, EventArgs e)
        {
            string url = @"D:/料仓组件.html";
            InitializeWebView2(url);
        }

        private void buttonTest_Click(object sender, EventArgs e)
        {
            if (webView21?.CoreWebView2 != null)
            {
                // 使用 JSON 格式传递数{值到 JS（Web Messaging）
                string jsonMessage = "{{\"value\": 42,\"partId\": \"Part1\"}}";
                //var message = new { value = 12.1, partId = 10 };
                //string jsonMessage = JsonSerializer.Serialize(message);
                webView21.CoreWebView2.PostWebMessageAsJson(jsonMessage);
                MessageBox.Show($"状态: 已发送 ");
            }
            else
            {
                MessageBox.Show("状态: WebView2 未初始化");
            }
        }
    }
}
